package com.quick.develop.flowable.application;

import com.quick.develop.flowable.domain.dto.task.BpmTaskDTO;
import com.quick.develop.flowable.domain.vo.task.BpmAddMultiExtReqVO;
import com.quick.develop.flowable.domain.vo.task.BpmTaskRejectReqVO;
import com.quick.develop.flowable.domain.vo.task.BpmTaskReqVO;
import com.quick.develop.flowable.domain.vo.task.BpmTaskUpdateAssigneeReqVO;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author junyuan.liu
 * @description: 
 * @date 2022/5/5 16:22
 */
public interface IBpmTaskApplication {

    /** 
     * @description  完成任务
     * @param taskVo 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:33
     */ 
    void complete(@Valid BpmTaskReqVO taskVo);

    /** 
     * @description  退回任务 根据多个节点key进行退回 可以退回多个节点到目的节点
     * @param taskVo 请求实体参数
     * @author junyuan.liu
     * @date 2022/7/4 14:33
     */ 
    void rollbackTaskByActivityIds(@Valid BpmTaskRejectReqVO taskVo);

    /** 
     * @description  根据taskID 进行退回 所有运行的节点都退回
     * @param taskVo 请求实体参数
     * @author junyuan.liu
     * @date 2022/7/4 14:33
     */ 
    void rollbackTaskByTaskId(@Valid BpmTaskRejectReqVO taskVo);

    /** 
     * @description  认领/签收任务
     * @param reqVO 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:34
     */ 
    void claim(@Valid BpmTaskReqVO reqVO);

    /** 
     * @description  取消认领任务
     * @param reqVO 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:34
     */ 
    void unClaim(@Valid BpmTaskReqVO reqVO);

    /** 
     * @description  委派任务
     * @param reqVO 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:35
     */ 
    void delegate(@Valid BpmTaskUpdateAssigneeReqVO reqVO);

    /** 
     * @description  转办任务
     * @param reqVO 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:35
     */ 
    void assignTask(@Valid BpmTaskUpdateAssigneeReqVO reqVO);


    /** 
     * @description  终止流程 暂未考虑子流程情况
     * @param reqVO 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:35
     */ 
    void stopTask(@Valid BpmTaskReqVO reqVO);

    /** 
     * @description  多实例动态加人
     * @param multiExtReqVo 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:36
     */ 
    void addMultiInstanceExecution(@Valid BpmAddMultiExtReqVO multiExtReqVo);

    /** 
     * @description  任务增加候选人
     * @param reqVO 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:36
     */ 
    void addCandidateUser(@Valid BpmTaskReqVO reqVO);

    /** 
     * @description  任务增加候选组
     * @param reqVO 请求体
     * @author junyuan.liu
     * @date 2022/7/4 14:36
     */ 
    void addCandidateGroup(@Valid BpmTaskReqVO reqVO);

    /** 
     * @description  判断是否可撤回
     * @param taskId 任务ID
     * @return java.lang.Boolean
     * @author junyuan.liu
     * @date 2022/7/4 14:36
     */ 
    Boolean canWithdrawTask(String taskId);

    /** 
     * @description  撤回任务
     * @param reqVO 请求
     * @author junyuan.liu
     * @date 2022/7/4 14:37
     */ 
    void withdrawTask(BpmTaskReqVO reqVO);

    /**
     * @description 通过 businessKey 获取主流程的已审批任务信息
     * @param businessKey 业务ID
     * @return java.util.List<com.quick.develop.flowable.domain.dto.task.BpmTaskDto>
     * @author junyuan.liu
     * @date 2022/8/11 13:27
     */
    List<BpmTaskDTO> getMainProcessHisTasksByBusinessKey(String businessKey);
    
    /** 
     * @description 获取子流程正在运行的任务 的处理人
     * @param ids 流程实例ID
     * @return java.util.Map<java.lang.String,java.util.Set<java.lang.String>>
     * @author junyuan.liu
     * @date 2022/8/17 18:35
     */ 
    Map<String, Set<String>> getSubProcessOnAssignee(Set<String> ids);
    
    /** 
     * @description 获取会签节点 审批情况 
     * @param taskId 正在运行的任务ID
     * @return java.util.List<com.quick.develop.flowable.domain.dto.task.BpmTaskDto>
     * @author junyuan.liu
     * @date 2022/8/23 16:39
     */ 
    List<BpmTaskDTO> getRunMultiTaskInfo(String taskId);
    
    /** 
     * @description 获取流程最近的任务 取最近创建时间
     * @param processInstanceId 流程实例ID
     * @return com.quick.develop.flowable.domain.dto.task.BpmTaskDTO
     * @author junyuan.liu
     * @date 2022/10/20 17:30
     */ 
    BpmTaskDTO getRecentlyTask(String processInstanceId);

    /**
     * @description 获取委托的原始人
     * @param taskId taskId
     * @return java.lang.String
     * @author junyuan.liu
     * @date 2023/2/27 10:39
     */
    String getEntrustOwner(String taskId);


}
